/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.knolle.lotes.gui;

import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.math.BigDecimal;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import javax.swing.event.EventListenerList;
import org.marcelo.agro.entidades.*;
import org.marcelo.agro.core.api.ILotes;
import org.marcelo.comun.validadores.MatcherClass;
import org.openide.WizardDescriptor;
import org.openide.util.HelpCtx;
import org.openide.util.Lookup;

public class LotesWizardPanel1 implements WizardDescriptor.Panel<WizardDescriptor>, PropertyChangeListener {

    /**
     * The visual component that displays this panel. If you need to access the
     * component from this class, just use getComponent().
     */
    private WizardDescriptor model;
    private LotesVisualPanel1 component;
    private Boolean isValid = false;
    private Color color = Color.PINK;
    private ILotes il = Lookup.getDefault().lookup(ILotes.class);
    private Lotes lote = null;
    private final EventListenerList listeners = new EventListenerList();

    // Get the visual component for the panel. In this template, the component
    // is kept separate. This can be more efficient: if the wizard is created
    // but never displayed, or not all panels are displayed, it is better to
    // create only those which really need to be visible.
    @Override
    public LotesVisualPanel1 getComponent() {
        if (component == null) {
            if (lote == null) {
                lote = new Lotes();
                component = new LotesVisualPanel1();
            }
            else {
                component = new LotesVisualPanel1(lote);
            }
        }
        return component;
    }

    @Override
    public HelpCtx getHelp() {
        // Show no Help button for this panel:
        return HelpCtx.DEFAULT_HELP;
        // If you have context help:
        // return new HelpCtx("help.key.here");
    }

    @Override
    public boolean isValid() {
        // If it is always OK to press Next or Finish, then:
        return isValid;
        // If it depends on some condition (form filled out...) and
        // this condition changes (last form field filled in...) then
        // use ChangeSupport to implement add/removeChangeListener below.
        // WizardDescriptor.ERROR/WARNING/INFORMATION_MESSAGE will also be useful.
    }

    @Override
    public void addChangeListener(ChangeListener l) {
        listeners.add(ChangeListener.class, l);
    }

    @Override
    public void removeChangeListener(ChangeListener l) {
        listeners.remove(ChangeListener.class, l);
    }
    
    protected final void fireChangeEvent(
        Object source, boolean oldState, boolean newState) {
            if(oldState != newState) {
                ChangeEvent ev = new ChangeEvent(source);
                    for (ChangeListener listener : listeners.getListeners(ChangeListener.class)) {
                        listener.stateChanged(ev);
                    }
            }
    }

    @Override
    public void readSettings(WizardDescriptor wiz) {
        // use wiz.getProperty to retrieve previous panel state
       this.model = wiz;
       getComponent().addPropertyChangeListener(this);
    }

    @Override
    public void storeSettings(WizardDescriptor wiz) {
        // use wiz.putProperty to remember current panel state
        //Aca debo obtener los datos y setear al objeto
        lote.setNombre(getComponent().getNombre().getText());
        try {
            lote.setDistrito( getComponent().getDistrito());
        }
        catch(Exception ignorar){}
        lote.setCompania(getComponent().getCompania());
        lote.setEsPropio(getComponent().getEsPropio());
        try {
            lote.setSuperficie( new BigDecimal(getComponent().getSuperficie().getText()));
        }
        catch (Exception ignorar) {}
        try {
            lote.setUnidadMedidaSuperficie((UnidadMedidaSuperficie) getComponent().getUnidadSuperficie());
        }
        catch(Exception ignorar) {}
        wiz.putProperty("lote", lote);
//        wiz.putProperty("lote", lote);
    }

    @Override
    public void propertyChange(PropertyChangeEvent evt) {
        //Detectar los cambios y setearlos al objeto, pasa por todos los if esta muy mal
        //debe haber un if else para cada item, para que entre en el indicado y haga lo que tenga que hacer
        //Aca tambien debe chequear la validacion
         boolean oldState = isValid;
         Boolean esUnico = false;
        if (evt.getPropertyName().equals(LotesVisualPanel1.PROPIEDAD_NOMBRE)) {
            lote.setNombre(getComponent().getNombre().getText());
            if (lote.getNombre().isEmpty()) {
                setMessage("El nombre no puede estar vacio");
                getComponent().getNombre().setBackground(color);
                isValid = false;
            
            }
            else{
               try {
                    esUnico = !il.esUnico(lote);
                }
                catch (Exception e) {
                    System.err.println(e);
                }    
            
                if (esUnico){
                    setMessage("Existe ya un lote con el mismo nombre");
                    getComponent().getNombre().setBackground(color);
                    isValid = false;
                }
                else {
                    getComponent().getNombre().setBackground(Color.WHITE);
                    isValid= true;
                }
            }
        }
        
        
        else if (evt.getPropertyName().equals(LotesVisualPanel1.PROPIEDAD_DISTRITO)) {
            //Setear el distrito
            try {
                lote.setDistrito( getComponent().getDistrito());
            }
            catch (Exception ignore) {}
        }
//        
        else if (evt.getPropertyName().equals(LotesVisualPanel1.PROPIEDAD_COMPANIA)) {
//            //Setear el campo Compania
            lote.setCompania(getComponent().getCompania());  
        }

        else if (evt.getPropertyName().equals(LotesVisualPanel1.PROPIEDAD_ES_PROPIO)) {
            Boolean newValue = (Boolean) evt.getNewValue();
            lote.setEsPropio(true == newValue?1:0); 
        }
        else if (evt.getPropertyName().equals(LotesVisualPanel1.PROPIEDAD_SUPERFICIE)){
//        Validar Campo superficie
           String superficieText= getComponent().getSuperficie().getText();
           if (superficieText.isEmpty()){
                setMessage("La superficie no puede estar vacia");
                getComponent().getSuperficie().setBackground(color);
                isValid = false;
            }
            else {
                try {
                    //Debo tambien chequear el factor de multiplicacion
                    BigDecimal superficie = new BigDecimal(superficieText);
                    BigDecimal totalSuperficie = getComponent().getUnidadSuperficie().getFactorMultiplicacion();
                    totalSuperficie = totalSuperficie.multiply(superficie);
                    if (totalSuperficie.compareTo(il.MAX_VALUE) > 0) {
//                        El numero ingresado excede al limite maximo;
                        setMessage("El numero es mayor al maximo permitido ");
                        getComponent().getSuperficie().setBackground(color);
                        isValid = false;
                    }
                    else if (totalSuperficie.compareTo(il.MIN_VALUE) < 0){
                        setMessage("El numero es menor al minimo permitido [0]");
                        getComponent().getSuperficie().setBackground(color);
                        isValid = false;
                    }
                    else {
                        isValid = true;
                        getComponent().getSuperficie().setBackground(Color.WHITE);
                    }
                }
                catch (NumberFormatException nfe) {
                    //No es un numero
                    setMessage("El dato ingresado no corresponde a un numero");
                    getComponent().getSuperficie().setBackground(color);
                    isValid = false;
                }
                
            }
        }
        else if (evt.getPropertyName().equals(LotesVisualPanel1.PROPIEDAD_UNIDAD_MEDIDA)){
            try {
                lote.setUnidadMedidaSuperficie(getComponent().getUnidadSuperficie());
            }
            catch(Exception ignore) {}        
        }
        if (isValid) {
            model.getNotificationLineSupport().clearMessages();
        }
        fireChangeEvent(this, oldState, isValid);
    }
        
    
    
    private void setMessage(String message) {
        
            model.getNotificationLineSupport().setErrorMessage(message);
        
    }
    
    /**
     * Metodo para verificar si los datos ingresados por el usuario son correctos
     * Si son correctos permitira guardar los datos, si no son correctos no permitira guardar
     * los datos, lastimosamnete esta implementacion no me agrada por que todos los datos no puedo meter en un 
     * solo metodo, debo utilizar dos metodos
     * @return 
     */
    private boolean checkValidity() {
        boolean esValido = true;
        lote.setNombre( getComponent().getNombre().getText() ) ;
        String superficie = getComponent().getSuperficie().getText();
        
        if (esValido) {
        }
        else { 
            getComponent().getNombre().setBackground(Color.WHITE);
        }
        
        if (superficie.isEmpty()){
            setMessage("La superficie no puede estar vacia");
            getComponent().getSuperficie().setBackground(color);
            esValido = false;
        }
        else {
            MatcherClass matcher = new MatcherClass(MatcherClass.TIPOS_VALIDACION.CAMPO_DECIMALES_POSITIVO,superficie);
            if (!matcher.match()){
                getComponent().getSuperficie().setBackground(color);
                setMessage(matcher.getMensaje());
                esValido = false;
            }
            else {
                getComponent().getSuperficie().setBackground(Color.WHITE);   
            }
        }
//        Limpiar todos los errores
        if (esValido)
            model.getNotificationLineSupport().clearMessages();
        return esValido;
    }
    
    //Agregue para poder enviar el lote a editar

    public LotesWizardPanel1() {
        
    }
    
    //Aca podra editarse un lote
    
    public LotesWizardPanel1(Lotes lote){
        this.lote =   lote ;
    }
    
//    private void lanzarEvento(Boolean valido) {
//        boolean oldState = isValid;
//        isValid = valido;
//        if (valido) {
//            model.getNotificationLineSupport().clearMessages();
//        }
//        fireChangeEvent(this, oldState, isValid);
//        
//    }
    
}
